home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume89 / fun / wand22.3 < prev    next >
Internet Message Format  |  1989-04-26  |  42KB

  1. Path: xanth!ames!oliveb!sun!rishathra!page
  2. From: page%rishathra@Sun.COM (Bob Page)
  3. Newsgroups: comp.sources.amiga
  4. Subject: v89i096:  wanderer - the game v2.2, Part03/03
  5. Message-ID: <101239@sun.Eng.Sun.COM>
  6. Date: 26 Apr 89 07:37:36 GMT
  7. Sender: news@sun.Eng.Sun.COM
  8. Lines: 1582
  9. Approved: page@sun.com
  10.  
  11. Submitted-by: mab@druwy.att.com (Alan Bland)
  12. Posting-number: Volume 89, Issue 96
  13. Archive-name: fun/wand22.3
  14.  
  15. # This is a shell archive.
  16. # Remove anything above and including the cut line.
  17. # Then run the rest of the file through 'sh'.
  18. # Unpacked files will be owned by you and have default permissions.
  19. #----cut here-----cut here-----cut here-----cut here----#
  20. #!/bin/sh
  21. # shar: SHell ARchive
  22. # Run the following text through 'sh' to create:
  23. #    help.c
  24. #    icon.c
  25. #    jump.c
  26. #    m.c
  27. #    read.c
  28. #    save.c
  29. #    scores.c
  30. #    wand_head.h
  31. # This is archive 3 of a 3-part kit.
  32. # This archive created: Tue Apr 25 00:28:08 1989
  33. echo "extracting help.c"
  34. sed 's/^X//' << \SHAR_EOF > help.c
  35. X/* From jason@uucp.aeras */
  36. X
  37. X#include "wand_head.h"
  38. X
  39. X/* this help text structure allows graphic icons to be displayed along
  40. X * with the help text.  if your machine doesn't do graphics, it still
  41. X * works ok with the text representation.
  42. X */
  43. Xstruct {
  44. X    char *text;    /* text for this line */
  45. X    short col;    /* column position for graphic icon, -1 for none */
  46. X    short offrow;    /* row offset, fakes multiple icons per row */
  47. X    char icon;    /* icon character to display */
  48. X} help[]={
  49. X"      **  W A N D E R E R  **      ", -1,0,0,    /* 0 */
  50. X"    ===========================    ", -1,0,0,    /* 1 */
  51. X"        by Steven Shipway          ", -1,0,0,    /* 2 */
  52. X"How to play:                       ", -1,0,0,    /* 3 */
  53. X" Collect all the treasure:         ", 30,0,'*',/* 4 */
  54. X"                                   ", -1,0,0,    /* 5 */
  55. X" Then go through the exit:         ", 30,0,'X',/* 6 */
  56. X"                                   ", -1,0,0,    /* 7 */
  57. X#ifdef AMIGA
  58. X"  Use mouse, cursor keys or        ", -1,0,0,    /* 8 */
  59. X"  h,j,k,l keys move around.        ", -1,0,0,    /* 9 */
  60. X"                  ESC Quit game    ", -1,0,0,    /* 10 */
  61. X"                  F10 Look at map  ", -1,0,0,    /* 11 */
  62. X"    F6 Save game   F7 Restore Game ", -1,0,0,    /* 12 */
  63. X"  HELP Help mode   F3 Center screen", -1,0,0,    /* 13 */
  64. X"    F1 Jump level  F2 Switch mode  ", -1,0,0,    /* 14 */
  65. X#else
  66. X"  h  Left       j  Down            ", -1,0,0,    /* 8 */
  67. X"  k  Up         l  Right           ", -1,0,0,    /* 9 */
  68. X"  1  Loud       q  Quit game       ", -1,0,0,    /* 10 */
  69. X"  0  Quiet      !  Look at map     ", -1,0,0,    /* 11 */
  70. X"  S  Save game  R  Restore Game    ", -1,0,0,    /* 12 */
  71. X"  ?  Help mode  @  Center screen   ", -1,0,0,    /* 13 */
  72. X"  ~  Jump level #  Switch mode     ", -1,0,0,    /* 14 */
  73. X#endif
  74. X" nb: No level bonus for jumping.   ", -1,0,0,    /* 15 */
  75. X
  76. X#ifdef AMIGA
  77. X"This is you:                       ", -1,0,0,    /* 0 */
  78. X"                                   ", 5,0,'@',    /* 1 */
  79. X"                                   ", -1,0,0,    /* 2 */
  80. X#else
  81. X"This is you:  You are a spider.    ", -1,0,0,    /* 0 */
  82. X"              (At least, that's    ", 5,0,'@',    /* 1 */
  83. X"              what you look like)  ", -1,0,0,    /* 2 */
  84. X#endif
  85. X"                                   ", -1,0,0,    /* 3 */
  86. X"The other items you will find are: ", -1,0,0,    /* 4 */
  87. X"                                   ", -1,0,0,    /* 5 */
  88. X"                                   ", 1,0,'#',    /* 6 */
  89. X"      and        Solid rock        ", 10,-1,'=',/* 7 */
  90. X"                                   ", -1,0,0,    /* 8 */
  91. X"        Time capsule (5 points,    ", 2,0,'C',    /* 9 */
  92. X"        +250 extra moves)          ", -1,0,0,    /* 10 */
  93. X"                                   ", -1,0,0,    /* 11 */
  94. X"        Passable earth (one point) ", 2,0,':',    /* 12 */
  95. X"                                   ", -1,0,0,    /* 13 */
  96. X"       Teleport  (50 points for    ", 1,0,'T',    /* 14 */
  97. X"                  using it)        ", -1,0,0,    /* 15 */
  98. X
  99. X"        Boulder (falls down, other ", 2,0,'O',    /* 0 */
  100. X"        boulders and arrows fall   ", -1,0,0,    /* 1 */
  101. X"        off of it)                 ", -1,0,0,    /* 2 */
  102. X"                                   ", -1,0,0,    /* 3 */
  103. X"               Arrows              ", 1,0,'<',    /* 4 */
  104. X"      and      (run left and right)", 10,-1,'>',/* 5 */
  105. X"                                   ", -1,0,0,    /* 6 */
  106. X"        Cage - holds baby monsters ", 2,0,'=',    /* 7 */
  107. X"        and changes into diamonds  ", -1,0,0,    /* 8 */
  108. X"                                   ", -1,0,0,    /* 9 */
  109. X"         (10 points)               ", 2,0,'*',    /* 10 */
  110. X"         Money  (collect it)       ", -1,0,0,    /* 11 */
  111. X"                                   ", -1,0,0,    /* 12 */
  112. X"       Baby monster (kills you)    ", 2,0,'S',    /* 13 */
  113. X"                                   ", -1,0,0,    /* 14 */
  114. X"                                   ", -1,0,0,    /* 15 */
  115. X
  116. X"When a baby monster hits a cage it ", -1,0,0,    /* 0 */
  117. X"is captured and you get 50 points. ", -1,0,0,    /* 1 */
  118. X"The cage also becomes a diamond.   ", -1,0,0,    /* 2 */
  119. X"                                   ", -1,0,0,    /* 3 */
  120. X"      Instant annihilation         ", 1,0,'!',    /* 4 */
  121. X"                                   ", -1,0,0,    /* 5 */
  122. X"                                   ", -1,0,0,    /* 6 */
  123. X"               Slopes (boulders    ", 1,0,'\\',/* 7 */
  124. X"     and       and etc slide off)  ", 9,-1,'/',/* 8 */
  125. X"                                   ", -1,0,0,    /* 9 */
  126. X"      Monster  (eats you up whole. ", 1,0,'M',    /* 10 */
  127. X"      Yum Yum yum..) (100 points)  ", -1,0,0,    /* 11 */
  128. X"      (kill with a rock or arrow)  ", -1,0,0,    /* 12 */
  129. X"                                   ", -1,0,0,    /* 13 */
  130. X"      Exit -- Must Collect all the ", 1,0,'X',    /* 14 */
  131. X"      treasure first. (250 bonus)  ", -1,0,0,    /* 15 */
  132. X
  133. X"      A new addition for version   ", 1,0,'^',    /* 0 */
  134. X"      2.2M . The balloon rises,    ", -1,0,0,    /* 1 */
  135. X"      and is popped by arrows. It  ", -1,0,0,    /* 2 */
  136. X"      does *not* kill you.         ", -1,0,0,    /* 3 */
  137. X"                                   ", -1,0,0,    /* 4 */
  138. X"      Unrecognised symbol in map.  ", 1,0,'-',    /* 5 */
  139. X"      This is probably a **bug** ! ", -1,0,0,    /* 6 */
  140. X"                                   ", -1,0,0,    /* 7 */
  141. X" ENVIRONMENT VARIABLES:            ", -1,0,0,    /* 8 */
  142. X"                                   ", -1,0,0,    /* 9 */
  143. X"   NEWNAME,NAME : Checked in that  ", -1,0,0,    /* 10 */
  144. X"       order for the hiscore table ", -1,0,0,    /* 11 */
  145. X"   NEWKEYS : Redefine movement keys", -1,0,0,    /* 12 */
  146. X"       eg- 'hlkj' for default      ", -1,0,0,    /* 13 */
  147. X"   SAVENAME : File used for saved  ", -1,0,0,    /* 14 */
  148. X"       games.                      ", -1,0,0    /* 15 */
  149. X};
  150. X
  151. X
  152. X
  153. Xvoid
  154. Xhelpme()    /* routine to show help menu. */
  155. X{
  156. X    int i = 0, i1 = 0, i2 = 0;  /* loop counters */
  157. X    char ch;
  158. X
  159. X    draw_box(0,0,43,19);
  160. X    for(i1 = 0; i1 < 5; i1++)  /* times to show loop. */
  161. X    {
  162. X        setcolor(WHITE, DK_GREEN);
  163. X        for(i = 0; i < 16; i++)    /* show one menu. */
  164. X        {
  165. X            move(i+1,1);  /* move to start of line. */
  166. X            addstr(help[i2+i].text);
  167. X        }
  168. X        /* now go back and draw any icon images */
  169. X        for(i = 0; i < 16; i++)    /* show one menu. */
  170. X        {
  171. X            if (help[i2+i].col >= 0)
  172. X            {
  173. X                /* draw the beastie */
  174. X                draw_symbol(help[i2+i].col+1,i+help[i2+i].offrow,help[i2+i].icon);
  175. X            }
  176. X        }
  177. X
  178. X        i2 += 16;
  179. X
  180. X        move(i+1,1);  /* move to start of line. */
  181. X        setcolor(YELLOW, DK_GREEN);
  182. X        addstr("<return> to continue, <space> to exit");
  183. X        refresh();    /* show on screen. */
  184. X        ch = (char) getchar();    /* just for now, get anything. */
  185. X        if(ch == ' ') /* if return or what ever.. */
  186. X            break;  /* exit routine now. */
  187. X    }
  188. X    setcolor(TEXT_COLOR, BACK_COLOR);
  189. X    for (i=0; i<19; i++)
  190. X    {
  191. X        move(i,0);  /* move to start of line. */
  192. X        addstr("                                              ");
  193. X    }
  194. X}
  195. X
  196. Xcredits()
  197. X{
  198. X    char buffer[512];
  199. X    FILE *fp;
  200. X    int i;
  201. X    clear();
  202. X    sprintf(buffer,"%s/credits",SCREENPATH);
  203. X    if((fp = fopen(buffer,"r")) == NULL) {
  204. X            addstr(" Sorry - credits unavailable!\n");
  205. X        }
  206. X    else {
  207. X        i = 0;
  208. X        while(fgets(buffer,512,fp) != NULL) {
  209. X            addstr(buffer);
  210. X        if (++i == LINES-2) {
  211. X            addstr("Press any key.");
  212. X            refresh();
  213. X            getch();
  214. X            i = 0;
  215. X            clear();
  216. X        }
  217. X        }
  218. X    }
  219. X    addstr("Press any key.");
  220. X    refresh();
  221. X    getch();
  222. X}
  223. SHAR_EOF
  224. echo "extracting icon.c"
  225. sed 's/^X//' << \SHAR_EOF > icon.c
  226. X#include "wand_head.h"
  227. X
  228. X#ifdef AMIGA
  229. X#include "pw.images.h"        /* AMIGA image bitmaps */
  230. X#endif
  231. X
  232. Xvoid draw_symbol(x,y,ch)        /* this is where the pretty graphics are */
  233. X                /* all defined - change them if you want.. */
  234. Xint  x,y;
  235. Xchar ch;
  236. X{
  237. X#ifdef AMIGA
  238. X    /* show graphics images on the AMIGA */
  239. X    struct Image *image;
  240. X    switch(ch)
  241. X    {
  242. X    case ' ':                    /*  space  */
  243. X    image = &grassimage;
  244. X        break;
  245. X    case '#':                   /*  rock  */
  246. X    image = &rockimage;
  247. X        break;
  248. X    case '<':                   /*  arrows  */
  249. X    image = &leftarrowimage;
  250. X        break;
  251. X    case '>':
  252. X    image = &rightarrowimage;
  253. X        break;
  254. X    case 'O':                    /* boulder  */
  255. X    image = &boulderimage;
  256. X        break;
  257. X    case ':':                    /*  earth  */
  258. X    image = &earthimage;
  259. X        break;
  260. X    case '/':                    /*  slopes */
  261. X    image = &leftslopeimage;
  262. X        break;
  263. X    case '\\':
  264. X    image = &rightslopeimage;
  265. X        break;
  266. X    case '*':                     /*  diamond  */
  267. X    image = &diamondimage;
  268. X        break;
  269. X    case '=':                     /*  rock  */
  270. X    image = &rock2image;
  271. X        break;
  272. X    case '@':                     /*  YOU!!! */
  273. X    image = &youimage;
  274. X        break;
  275. X    case 'T':                   /*  teleport  */
  276. X    image = &teleportimage;
  277. X        break;
  278. X    case 'X':                    /*  exits  */
  279. X    image = &exitimage;
  280. X        break;
  281. X    case '!':                    /*  landmine  */
  282. X    image = &bang1image;
  283. X        break;
  284. X    case 'M':                     /* big monster  */
  285. X    image = &monsterimage;
  286. X        break;
  287. X    case 'S':                     /* baby monster */
  288. X    image = &babymonsterimage;
  289. X        break;
  290. X    case '^':             /* balloon */
  291. X    image = &balloonimage;
  292. X        break;
  293. X    case 'C':                    /* time capsule */
  294. X    image = &timecapsuleimage;
  295. X        break;
  296. X    case '+':                    /* cage */
  297. X    image = &cageimage;
  298. X        break;
  299. X    default:                         /* this is what it uses if it doesnt */
  300. X                     /* recognise the character  */
  301. X    image = &unknownimage;
  302. X        break;
  303. X    }
  304. X    DrawImage(R, image, x*8 + 8, y*8 + 8);
  305. X
  306. X#else
  307. X    char icon[2][4],
  308. X         (*iconrow)[4] = icon;
  309. X
  310. X    switch(ch)
  311. X    {
  312. X    case ' ':                    /*  space  */
  313. X        strcpy(*iconrow++,"   ");
  314. X        strcpy(*iconrow,  "   ");
  315. X        break;
  316. X    case '#':                   /*  rock  */
  317. X        strcpy(*iconrow++,"###");
  318. X        strcpy(*iconrow,  "###");
  319. X        break;
  320. X    case '<':                   /*  arrows  */
  321. X        strcpy(*iconrow++,"<--");
  322. X        strcpy(*iconrow,  "<--");
  323. X        break;
  324. X    case '>':
  325. X        strcpy(*iconrow++,"-->");
  326. X        strcpy(*iconrow,  "-->");
  327. X        break;
  328. X    case 'O':                    /* boulder  */
  329. X        strcpy(*iconrow++,"/^\\");
  330. X        strcpy(*iconrow,  "\\_/");
  331. X        break;
  332. X    case ':':                    /*  earth  */
  333. X        strcpy(*iconrow++,". .");
  334. X        strcpy(*iconrow,  " . ");
  335. X        break;
  336. X    case '/':                    /*  slopes */
  337. X        strcpy(*iconrow++," _/");
  338. X        strcpy(*iconrow,  "/  ");
  339. X        break;
  340. X    case '\\':
  341. X        strcpy(*iconrow++,"\\_ ");
  342. X        strcpy(*iconrow,  "  \\");
  343. X        break;
  344. X    case '*':                     /*  diamond  */
  345. X        strcpy(*iconrow++,"/$\\");
  346. X        strcpy(*iconrow,  "\\$/");
  347. X        break;
  348. X    case '=':                     /*  rock  */
  349. X        strcpy(*iconrow++,"=-=");
  350. X        strcpy(*iconrow,  "-=-");
  351. X        break;
  352. X    case '@':                     /*  YOU!!! */
  353. X        strcpy(*iconrow++," o ");
  354. X        strcpy(*iconrow,  "<|>");
  355. X        break;
  356. X    case 'T':                   /*  teleport  */
  357. X        strcpy(*iconrow++,"(*)");
  358. X        strcpy(*iconrow,  "(*)");
  359. X        break;
  360. X    case 'X':                    /*  exits  */
  361. X        strcpy(*iconrow++,"Way");
  362. X        strcpy(*iconrow,  "Out");
  363. X        break;
  364. X    case '!':                    /*  landmine  */
  365. X        strcpy(*iconrow++," I ");
  366. X        strcpy(*iconrow,  " o ");
  367. X        break;
  368. X    case 'M':                     /* big monster  */
  369. X        strcpy(*iconrow++,"}o{");
  370. X        strcpy(*iconrow,  "/^\\");
  371. X        break;
  372. X    case 'S':                     /* baby monster */
  373. X        strcpy(*iconrow++,"-o-");
  374. X        strcpy(*iconrow,  "/*\\");
  375. X        break;
  376. X    case '^':             /* balloon */
  377. X        strcpy(*iconrow++,"/~\\");
  378. X        strcpy(*iconrow,  "\\_X");
  379. X        break;
  380. X    case 'C':                    /* time capsule */
  381. X        strcpy(*iconrow++,"   ");
  382. X        strcpy(*iconrow,  "<O>");
  383. X        break;
  384. X    case '+':                    /* cage */
  385. X        strcpy(*iconrow++,"TTT");
  386. X        strcpy(*iconrow,  "III");
  387. X        break;
  388. X    default:                         /* this is what it uses if it doesnt */
  389. X                     /* recognise the character  */
  390. X        strcpy(*iconrow++,"OOO");
  391. X        strcpy(*iconrow,  "OOO");
  392. X        break;
  393. X    };
  394. X    move(y+1,x+1);
  395. X    iconrow--;
  396. X    addstr(*iconrow++);
  397. X    move(y+2,x+1);
  398. X    addstr(*iconrow);
  399. X#endif
  400. X}
  401. SHAR_EOF
  402. echo "extracting jump.c"
  403. sed 's/^X//' << \SHAR_EOF > jump.c
  404. X#include "wand_head.h"
  405. X
  406. Xextern int debug_disp;
  407. Xextern int no_passwords;
  408. Xextern int maxscreens;
  409. X
  410. X#ifndef DICTIONARY
  411. X    /* use this stuff if no dictionary file is defined */
  412. X    /* feel free to change the words, but don't change how many there are */
  413. X
  414. Xchar *dictionary[] = {  /* 8 per line, total 128 (16 lines) */
  415. X"zero","frog","insanity","hack","stardust","whimpy","lost","rattlesnake",
  416. X"panic","crisis","centipede","zaxxon","birdbrain","feeble","juggler","eunuchs",
  417. X"unix","amigoid","squirrel","moose","natasha","gyroscope","relax","superstar",
  418. X"winner","cheater","liberal","quail","insignificant","oxen","leap","orange",
  419. X"troll","zipper","drum","nuke","waste","want","secretword","wyrm",
  420. X"english","allegro","treefrog","bullfrog","dump","lunch","donut","lemon",
  421. X"helpme","fly","swim","joystick","rambo","leaf","horrible","unknown",
  422. X"high","mountain","mispeled","valley","zappa","glass","crunch","sdi",
  423. X"squiggly","worms","hint","wanderer","rogue","people","veggie","barf",
  424. X"exhausted","raygun","butcher","reebok","gnu","bicycle","fish","boulder",
  425. X"repeat","crisis","centipede","birdbrain","lost","rattler","snake","oops",
  426. X"squirrel","panic","zero","insanity","whimpy","nifty","crunch","oops",
  427. X"paperclip","keynote","keystone","vail","aspen","fall","short","dwarf",
  428. X"oboe","bazooka","bassoon","torpedo","risky","bored","cat","music",
  429. X"tinker","thunk","liver","onions","tastey","uggh","badnews","whynot",
  430. X"because","monster","quest","griffin","gomf","shoe","serpent","tammy"
  431. X};
  432. X#endif
  433. X
  434. Xint scrn_passwd(num, passwd)    /* reads password num into passwd */
  435. Xint num;
  436. Xchar *passwd;
  437. X{
  438. X#ifdef DICTIONARY
  439. X    long position;
  440. X    FILE *fp;
  441. X
  442. X    position = PASSWD;
  443. X    while(position > 200000)
  444. X        position -= 200000;
  445. X    if((fp = fopen(DICTIONARY,"r")) == NULL)
  446. X        return 0;
  447. X    fseek(fp,position,ftell(fp));
  448. X    while(fgetc(fp) != '\n');
  449. X    fscanf(fp,"%s\n",passwd);
  450. X    /* read a word into passwd */
  451. X    fclose(fp);
  452. X    return (1);
  453. X#else
  454. X    static int firsttime = 1;
  455. X    if (firsttime)
  456. X    {
  457. X        /* first time thru, shuffle the passwords in memory */
  458. X        /* this thwarts the disk browsers */
  459. X        register int i;
  460. X        register char *temp;
  461. X
  462. X        firsttime = 0;
  463. X        for (i=0; i<64; i+=2)
  464. X        {
  465. X            temp = dictionary[i];
  466. X            dictionary[i] = dictionary[i+64];
  467. X            dictionary[i+64] = temp;
  468. X        }
  469. X        for (i=0; i<123; i+=3)
  470. X        {
  471. X            temp = dictionary[i];
  472. X            dictionary[i] = dictionary[i+2];
  473. X            dictionary[i+2] = dictionary[i+1];
  474. X            dictionary[i+1] = temp;
  475. X        }
  476. X    }
  477. X    strcpy(passwd, dictionary[num&127]);
  478. X    return (1);
  479. X#endif
  480. X}
  481. X
  482. Xvoid showpass(num)
  483. Xint num;
  484. X{
  485. Xchar correct[20];
  486. Xchar buffer[100];
  487. Xchar ch;
  488. Xint  passline;
  489. Xif(no_passwords)
  490. X    return;
  491. Xif(!debug_disp)
  492. X    passline = 18;
  493. Xelse
  494. X    passline = 20;
  495. Xmove(passline,0);
  496. X
  497. Xif(!scrn_passwd(num,correct))
  498. X    return;
  499. X(void) sprintf(buffer,"The password to jump to level %d ( using ~ ) is : %s        \n",(num+1),correct);
  500. Xaddstr(buffer);
  501. Xaddstr("PRESS ANY KEY TO REMOVE IT AND CONTINUE                          \n");
  502. Xrefresh();
  503. Xch = getch();
  504. Xmove(passline,0);
  505. Xaddstr("                                                                        \n");
  506. Xaddstr("                                              ");
  507. Xmove(passline,0);
  508. Xrefresh();
  509. X}
  510. X
  511. Xint jumpscreen(num)
  512. Xint num;
  513. X{
  514. Xchar word[20],
  515. X     buffer[100],
  516. X     correct[20];
  517. Xint index=0;
  518. Xint  scrn;
  519. Xint  passline;
  520. X
  521. Xif (!debug_disp)
  522. X    passline = 16;
  523. Xelse
  524. X    passline = 18;
  525. X
  526. Xif(no_passwords == 1) {
  527. X    move(passline,0);
  528. X    addstr("Enter number of desired level.\n");
  529. X    refresh();
  530. X    scrn = getnum();
  531. X    if(scrn > num) {
  532. X        move(passline,0);
  533. X        addstr("                                                ");
  534. X    return scrn;
  535. X    }
  536. X    move(passline,0);
  537. X    addstr("No way, Jose! Back-jumping is prohibited!");
  538. X    refresh();
  539. X    return num;
  540. X    }
  541. X
  542. Xmove(passline,0);
  543. Xaddstr("Please enter password of screen to jump to:");
  544. Xrefresh();
  545. Xwhile(((word[index++] = getch()) != '\n')&&(index < 19))
  546. X    {
  547. X    addch('*');
  548. X    refresh();
  549. X    }
  550. Xword[--index]='\0';
  551. Xmove(passline,0);
  552. Xaddstr("Validating...                                             \n");
  553. Xrefresh();
  554. X
  555. Xif(strcmp(word,MASTERPASSWORD) == 0)
  556. X    {
  557. X    move(passline,0);
  558. X    addstr("Enter number of desired level.");
  559. X    refresh();
  560. X    num = getnum();
  561. X    (void) scrn_passwd(num-1,correct);
  562. X    sprintf(buffer,"Certainly master, but the correct word is %s.       \n",correct);
  563. X    move(passline,0);
  564. X    addstr(buffer);
  565. X    addstr("PRESS ANY KEY TO REMOVE IT AND CONTINUE                          \n");
  566. X    refresh();
  567. X    getchar();
  568. X    move(passline,0);
  569. X    addstr("                                                             ");
  570. X    move(passline+1,0);
  571. X    addstr("                                                             ");
  572. X    move(passline,0);
  573. X    refresh();
  574. X    return num;
  575. X    }
  576. X
  577. Xfor(scrn = num;scrn < maxscreens;scrn++) {
  578. X    if(!scrn_passwd(scrn,correct))
  579. X    break;
  580. X    if(strcmp(correct,word) == 0)
  581. X        {
  582. X        move(passline,0);
  583. X        addstr("Password Validated..... Jumping to desired screen.        ");
  584. X        refresh();
  585. X        return ++scrn;
  586. X        }
  587. X    }
  588. X
  589. Xmove(passline,0);
  590. Xaddstr("PASSWORD NOT RECOGNISED!  Press any key...  ");
  591. Xrefresh();
  592. Xgetchar();
  593. Xmove(passline,0);
  594. Xaddstr("                                                          ");
  595. Xrefresh();
  596. X
  597. Xreturn num;
  598. X}
  599. X
  600. Xint getnum()
  601. X{
  602. Xchar ch;
  603. Xint num = 0;
  604. X    for(ch = getch(),addch(ch),refresh(); ch >= '0' && ch <= '9'; ch = getch(),addch(ch),refresh())
  605. X    {
  606. X    num = num * 10 + ch - '0';
  607. X    }
  608. X    return num;
  609. X}
  610. SHAR_EOF
  611. echo "extracting m.c"
  612. sed 's/^X//' << \SHAR_EOF > m.c
  613. X#include "wand_head.h"
  614. X
  615. Xextern char *playscreen();
  616. X
  617. Xextern int rscreen();
  618. X
  619. Xextern int savescore();
  620. X
  621. Xint debug_disp = 0;
  622. Xint no_passwords = 0;
  623. Xint maxscreens;
  624. Xchar screen[NOOFROWS][ROWLEN+1];
  625. Xint edit_mode = 0;
  626. Xint saved_game = 0;
  627. Xchar *edit_screen;
  628. X
  629. Xmain(argc,argv)
  630. Xint  argc;
  631. Xchar *argv[];
  632. X{
  633. Xchar (*frow)[ROWLEN+1] = screen;
  634. Xint num,score,bell = 0,maxmoves,fp,x,y;
  635. Xchar howdead[25],buffer[100],
  636. X     *name,*keys,*dead,ch;
  637. Xchar *malloc();
  638. X
  639. Xif(argc == 2)
  640. X    {
  641. X    if(!strcmp(argv[1], "-e"))
  642. X    {
  643. X    edit_mode = 1;
  644. X    edit_screen = NULL;
  645. X    }
  646. X    else if(!strcmp(argv[1], "-m"))
  647. X    {
  648. X    initscr();
  649. X    erase_scores();
  650. X    endwin();
  651. X    exit(0);
  652. X    }
  653. X    else if(!strcmp(argv[1], "-c"))
  654. X    {
  655. X    /* show credits */
  656. X    initscr();
  657. X    credits();
  658. X    endwin();
  659. X    exit(0);
  660. X        }
  661. X    else if(!strcmp(argv[1], "-s"))
  662. X    {
  663. X    initscr();
  664. X        savescore("-",0,0,"-");
  665. X    addstr("press any key");
  666. X    getch();
  667. X    endwin();
  668. X        exit(0);
  669. X    }
  670. X    else if(!strcmp(argv[1], "-f"))
  671. X        {
  672. X    debug_disp = 1;
  673. X    }
  674. X    else
  675. X    {
  676. X    fprintf(stderr,"Usage: %s [ -e [ file ] | -m | -c | -s | -f ]\n",argv[0]);
  677. X    exit(1);
  678. X        }
  679. X    }
  680. Xif(argc > 2)
  681. X    {
  682. X    if(!strcmp(argv[1],"-e"))
  683. X    {
  684. X    edit_mode = 1;
  685. X    edit_screen = argv[2];
  686. X    }
  687. X    else
  688. X    {
  689. X        fprintf(stderr,"Usage: %s [ -e [ file ] | -m | -c | -s | -f ]\n",argv[0]);
  690. X        exit(1);
  691. X    }
  692. X    }
  693. X
  694. X/* check for passwords - if file no_pws is in screen dir no pws! */
  695. Xsprintf(buffer,"%s/no_pws",SCREENPATH);
  696. Xif((fp = open(buffer,O_RDONLY)) != -1) {
  697. X    close(fp);
  698. X    no_passwords = 1;
  699. X}
  700. X
  701. X/* count available screens */
  702. Xfor(maxscreens = 0;;maxscreens++) {
  703. X    sprintf(buffer,"%s/screen.%d",SCREENPATH,(maxscreens+1));
  704. X    if((fp = open(buffer, O_RDONLY)) == -1 )
  705. X    break;
  706. X    close(fp);
  707. X}
  708. X
  709. Xinitscr();
  710. X
  711. Xif((name = (char *)getenv("NEWNAME")) == NULL)
  712. X    if((name = (char *)getenv("NAME")) == NULL)
  713. X        if((name = (char *)getenv("FULLNAME")) == NULL)
  714. X            if((name = (char *)getenv("USER")) == NULL)
  715. X        if((name = (char *)getenv("LOGNAME")) == NULL)
  716. X#ifdef    ASKNAME    /* M001 */
  717. X        {
  718. X            name = malloc(80);
  719. X            if (name == NULL) {
  720. X            addstr("malloc error\n");
  721. X            refresh();
  722. X            endwin();
  723. X            exit(1);
  724. X            }
  725. X
  726. X            draw_box(3,10,40,5);
  727. X            move(5,12);
  728. X            setcolor(YELLOW, DK_GREEN);
  729. X            addstr("What is your name? ");
  730. X            refresh();
  731. X            echo(); CBOFF;
  732. X            gets(name);
  733. X            noecho(); CBON;
  734. X            setcolor(TEXT_COLOR, BACK_COLOR);
  735. X            if (name[0] == '\0')
  736. X                name = "noname";
  737. X        }
  738. X#else
  739. X                name = "noname";
  740. X#endif
  741. X
  742. Xif((keys = (char *)getenv("NEWKEYS")) == NULL)
  743. X    {
  744. X    keys = "kjhl";
  745. X    }
  746. X
  747. X/* MAIN PROGRAM HERE */
  748. X
  749. XCBON; noecho();
  750. X
  751. Xwhile (1)
  752. X{
  753. X  num = 1;
  754. X  score = 0;
  755. X  maxmoves = 0;
  756. X  clear();
  757. X  if(!edit_mode) {
  758. X    for (;;) {
  759. X        if (rscreen(num,&maxmoves)) {
  760. X        strcpy(howdead,"a non-existant screen");
  761. X        break;
  762. X        };
  763. X        dead = playscreen(&num,&score,&bell,maxmoves,keys);
  764. X        if ((dead != NULL) && (*dead == '~')) {
  765. X        num = (int)(dead[1]) - 1;
  766. X        dead = NULL;
  767. X        }
  768. X        if (dead != NULL)
  769. X        {
  770. X        strcpy(howdead,dead);
  771. X            break;
  772. X            }
  773. X        num++;
  774. X        }
  775. X
  776. X    playSound(DEATH_SOUND);
  777. X    clear();
  778. X    setcolor(RED, BLACK);
  779. X    sprintf(buffer,"%s killed by %s with a score of %d on level %d.\n",name,howdead,score,num);
  780. X    addstr(buffer);
  781. X    }
  782. X  else
  783. X    {
  784. X    if(rscreen(num,&maxmoves))
  785. X    {
  786. X    for(x=0;x<ROWLEN;x++)
  787. X        for(y=0;y<NOOFROWS;y++)
  788. X        screen[y][x] =  ' ';
  789. X    }
  790. X    editscreen(num,&score,&bell,maxmoves,keys);
  791. X    }
  792. X  /* END OF MAIN PROGRAM */
  793. X
  794. X  /* SAVE ROUTINES FOR SCORES */
  795. X
  796. X  if(!edit_mode)
  797. X    {
  798. X    setcolor(WHITE, BLACK);
  799. X    if((savescore(howdead,score,num,name) == 0)&&(score != 0))
  800. X        addstr("\nWARNING: score not saved!\n\n");
  801. X    }
  802. X  setcolor(RED, BLACK);
  803. X  addstr("WANDERER (C)1988 S. Shipway.");
  804. X#ifdef AMIGA
  805. X  addstr("  AMIGA version by Alan Bland.");
  806. X#endif
  807. X
  808. X  /* ask if they want to play again - save loading time on floppy-based systems */
  809. X  setcolor(LT_GREEN, BLACK);
  810. X  addstr("\nDo you want to try again? ");
  811. X  refresh();
  812. X  while ((ch = getch()) != 'y' && ch != 'n') {}
  813. X  if (ch == 'n') break;
  814. X}
  815. X
  816. Xecho();
  817. XCBOFF;
  818. Xendwin();
  819. Xexit(0);
  820. X}
  821. SHAR_EOF
  822. echo "extracting read.c"
  823. sed 's/^X//' << \SHAR_EOF > read.c
  824. X#include "wand_head.h"
  825. X
  826. Xextern int edit_mode;
  827. Xextern char *edit_screen;
  828. Xextern char screen[NOOFROWS][ROWLEN+1];
  829. X
  830. Xint rscreen(num,maxmoves)
  831. Xint *maxmoves, num;
  832. X{
  833. Xint  y,ch;
  834. XFILE *fp;
  835. Xchar name[50], buffer[80];
  836. Xchar (*row_ptr)[ROWLEN+1] = screen;
  837. Xif(!edit_mode)
  838. X    sprintf(name,"%s/screen.%d",SCREENPATH,num);
  839. Xelse
  840. X    {
  841. X    if(!edit_screen)
  842. X        sprintf(name,"screen");
  843. X    else
  844. X    sprintf(name,"%s",edit_screen);
  845. X    }
  846. Xfp = fopen(name,"r");
  847. Xif(fp == NULL)
  848. X    {
  849. X    if(edit_mode)
  850. X    sprintf(buffer,"\nCannot find file %s.\n\n",name);
  851. X    else
  852. X        sprintf(buffer,"\nFile for screen %d unavailable.\n\n",num) ;
  853. X    addstr(buffer);
  854. X    }
  855. Xelse
  856. X    {
  857. X    for(y = 0;y<NOOFROWS;y++)
  858. X        {
  859. X        fgets((*row_ptr++),ROWLEN + 1,fp);
  860. X#ifndef AMIGA
  861. X    /* for some reason Amiga Lattice C behaves differently here */
  862. X    /* Amiga already removed the newline character */
  863. X    fgetc(fp);                         /* remove newline char*/
  864. X#endif
  865. X    }
  866. X    /* skip over final line, then read number of moves permitted */
  867. X    while ( (ch = fgetc(fp)) != '\n' && ch != EOF) {}
  868. X    if(fscanf(fp,"%d",maxmoves) != 1)
  869. X    *maxmoves=0;
  870. X    fclose(fp);
  871. X    }
  872. Xreturn (fp == NULL);
  873. X}
  874. X
  875. Xint wscreen(num,maxmoves)
  876. Xint maxmoves, num;
  877. X{
  878. Xint  y,x;
  879. XFILE *fp;
  880. Xchar name[50];
  881. Xchar (*row_ptr)[ROWLEN+1] = screen;
  882. Xif(!edit_screen)
  883. X    sprintf(name,"screen");
  884. Xelse
  885. X    sprintf(name,"%s",edit_screen);
  886. Xfp = fopen(name,"w");
  887. Xif(fp == NULL)
  888. X    {
  889. X#ifdef AMIGA
  890. X    strcpy(name, "ram:screenfile");
  891. X#else
  892. X    sprintf(name,"/tmp/screen.%d",getpid());
  893. X#endif
  894. X    fp = fopen(name,"w");
  895. X    move(21,0);
  896. X    addstr("Written file is ");
  897. X    addstr(name);
  898. X    refresh();
  899. X    }
  900. Xif(fp == NULL)
  901. X    addstr("\nFile for screen cannot be written.\n\n") ;
  902. Xelse
  903. X    {
  904. X    for(y = 0;y<NOOFROWS;y++)
  905. X        {
  906. X    for(x = 0;x<ROWLEN;x++)
  907. X        fputc(row_ptr[y][x],fp);
  908. X    fputc('\n',fp);
  909. X    };
  910. X    for(x = 0; x<ROWLEN;x++)
  911. X    fputc('#',fp);
  912. X    fputc('\n',fp);
  913. X    if(maxmoves != 0)
  914. X    fprintf(fp,"%d\n",maxmoves);
  915. X    fclose(fp);
  916. X    };
  917. Xreturn (fp == NULL);
  918. X}
  919. SHAR_EOF
  920. echo "extracting save.c"
  921. sed 's/^X//' << \SHAR_EOF > save.c
  922. X#include "wand_head.h"
  923. X#include <errno.h>
  924. X
  925. Xextern char screen[NOOFROWS][ROWLEN+1];
  926. Xextern int saved_game;
  927. X
  928. Xextern void crypt_file();
  929. Xstruct    saved_game    {
  930. X    short    num;
  931. X    short    score;
  932. X    short    bell;
  933. X    short    maxmoves;
  934. X    short    num_monsters;
  935. X};
  936. X
  937. Xstruct    save_vars    zz;
  938. X
  939. X/* save game and exit - if trouble occurs, return to game */
  940. Xvoid
  941. Xsave_game(num, score, bell, maxmoves, start_of_list, tail_of_list)
  942. Xint    num, *score, *bell, maxmoves;
  943. Xstruct    mon_rec    *start_of_list, *tail_of_list;
  944. X{
  945. X    char    fname[128], *fp, buffer[40];
  946. X    FILE    *fo;
  947. X    struct    saved_game    s;
  948. X    extern    char    *getenv();
  949. X    struct    mon_rec    *mp;
  950. X
  951. X    clear();
  952. X
  953. X    if ((char *)NULL == (fp = getenv("SAVENAME"))) {
  954. X        addstr("Saving game.... Filename ? ");
  955. X        refresh();
  956. X        fp = fname;
  957. X        echo(); CBOFF;
  958. X        gets(fp);
  959. X        CBON; noecho();
  960. X    }
  961. X    if ((FILE *)NULL == (fo = fopen(fp, W_BIN))) {
  962. X        addstr("\nUnable to save game, press any key.");
  963. X        refresh();
  964. X        getch();
  965. X        return;
  966. X    }
  967. X
  968. X    s.num = num;
  969. X    s.score = *score;
  970. X    s.bell = *bell;
  971. X    s.maxmoves = maxmoves;
  972. X    s.num_monsters = 0;
  973. X
  974. X    mp = start_of_list;        /* first entry is dummy    */
  975. X    while (mp != tail_of_list) {
  976. X        mp = mp->next;
  977. X        s.num_monsters++;    /* count them monsters    */
  978. X    }
  979. X
  980. X    if ( (1 != fwrite((char *)&s, sizeof(s), 1, fo)) ||
  981. X         (1 != fwrite((char *)screen, sizeof(screen), 1, fo)) ||
  982. X         (1 != fwrite((char *)&zz, sizeof(zz), 1, fo)) )
  983. X    {
  984. X        goto file_error;
  985. X    }
  986. X
  987. X    mp = start_of_list;
  988. X    while (mp != tail_of_list) {
  989. X        /* save them monsters    */
  990. X        mp = mp->next;
  991. X        if (1 != fwrite((char *)mp, sizeof(struct mon_rec), 1, fo)) {
  992. Xfile_error:
  993. X            sprintf(buffer, "Write error on '%s', press any key.", fname);
  994. X            addstr(buffer);
  995. X            refresh();
  996. X            fclose(fo);
  997. X            unlink(fname);
  998. X            getch();
  999. X            return;
  1000. X        }
  1001. X    }
  1002. X
  1003. X    fclose(fo);
  1004. X#ifndef NO_ENCRYPTION
  1005. X    crypt_file(fp,0);   /* encrpyt the saved game */
  1006. X#endif
  1007. X    echo();
  1008. X    CBOFF;
  1009. X    endwin();
  1010. X    exit(0);
  1011. X}
  1012. X
  1013. Xvoid
  1014. Xrestore_game(num, score, bell, maxmoves, start_of_list, tail_of_list)
  1015. Xint    *num, *score, *bell, *maxmoves;
  1016. Xstruct    mon_rec    *start_of_list, **tail_of_list;
  1017. X{
  1018. X    FILE    *fi;
  1019. X    struct    saved_game    s;
  1020. X    struct    mon_rec    *mp, *tmp, tmp_monst;
  1021. X    char    fname[128], *fp, buffer[80];
  1022. X    FILE    *fo;
  1023. X    extern    char    *getenv();
  1024. X
  1025. X    if ((char *)NULL == (fp = getenv("SAVENAME"))) {
  1026. X        move((LINES-1),0);
  1027. X        addstr("Restore Filename ? ");
  1028. X        refresh();
  1029. X        echo(); CBOFF;
  1030. X        fp = fname;
  1031. X        gets(fp);
  1032. X        CBON; noecho();
  1033. X    }
  1034. X    clear();
  1035. X    refresh();
  1036. X#ifndef NO_ENCRYPTION
  1037. X     crypt_file(fp,1);   /*decrypt it*/
  1038. X#endif
  1039. X    if ((FILE *)NULL == (fi = fopen(fp, R_BIN))) {
  1040. X        sprintf(buffer, "Open error on '%s'\n", fp);
  1041. X        addstr(buffer);
  1042. X        goto cant_restore;
  1043. X    }
  1044. X    if ( (1 != fread((char *)&s, sizeof(s), 1, fi)) ||
  1045. X         (1 != fread((char *)screen, sizeof(screen), 1, fi)) ||
  1046. X         (1 != fread((char *)&zz, sizeof(zz), 1, fi)) ) {
  1047. X        sprintf(buffer, "Read error on '%s'\n", fp);
  1048. X        addstr(buffer);
  1049. X        fclose(fi);
  1050. X        goto cant_restore;
  1051. X    }
  1052. X
  1053. X    *num = s.num;
  1054. X    *score = s.score;
  1055. X    *bell = s.bell;
  1056. X    *maxmoves = s.maxmoves;
  1057. X
  1058. X    /* free any monsters already on chain, to start clean */
  1059. X    mp = start_of_list->next;
  1060. X    while ((mp != NULL) && (mp != start_of_list)) {
  1061. X        /* free them monsters    */
  1062. X        tmp = mp;
  1063. X        mp = mp->next;
  1064. X        free(tmp);
  1065. X    }
  1066. X
  1067. X    /* re-initialize the monster list    */
  1068. X    /* *start_of_list = {0,0,0,0,0,NULL,NULL}; */
  1069. X    start_of_list->x = 0;
  1070. X    start_of_list->y = 0;
  1071. X    start_of_list->mx = 0;
  1072. X    start_of_list->my = 0;
  1073. X    start_of_list->under = 0;
  1074. X    start_of_list->next = (struct mon_rec *)NULL;
  1075. X    start_of_list->prev = (struct mon_rec *)NULL;
  1076. X
  1077. X    *tail_of_list = start_of_list;
  1078. X
  1079. X    while (s.num_monsters--) {
  1080. X        /* use make_monster to allocate the monster structures    */
  1081. X        /* to get all the linking right without even trying    */
  1082. X        if ((struct mon_rec *)NULL == (mp = make_monster(0, 0))) {
  1083. X            sprintf(buffer,"Monster alloc error on '%s'\n", fp);
  1084. X            addstr(buffer);
  1085. X                        addstr("Try again - it might work.\nBut then,pigs might fly...\n");
  1086. X            fclose(fi);
  1087. X            goto cant_restore;
  1088. X        }
  1089. X        if (1 != fread((char *)&tmp_monst, sizeof(struct mon_rec), 1, fi)) {
  1090. X            sprintf(buffer,"Monster read error on '%s'\n", fp);
  1091. X            addstr(buffer);
  1092. X            fclose(fi);
  1093. Xcant_restore:
  1094. X            addstr("Cannot restore game --- sorry.\n");
  1095. X            addstr("Press any key...");
  1096. X            refresh();
  1097. X            getch();
  1098. X            endwin();
  1099. X            exit(1);
  1100. X        }
  1101. X        /* copy info without trashing links    */
  1102. X        mp->x     = tmp_monst.x;
  1103. X        mp->y     = tmp_monst.y;
  1104. X        mp->mx    = tmp_monst.mx;
  1105. X        mp->my    = tmp_monst.my;
  1106. X        mp->under = tmp_monst.under;
  1107. X    }
  1108. X
  1109. X    fclose(fi);
  1110. X    unlink(fp);
  1111. X    saved_game = 1;
  1112. X}
  1113. SHAR_EOF
  1114. echo "extracting scores.c"
  1115. sed 's/^X//' << \SHAR_EOF > scores.c
  1116. X#include "wand_head.h"
  1117. X
  1118. X#if    MSDOS | AMIGA    /* M001    */
  1119. X#define    LOCK
  1120. X#define    UNLOCK
  1121. X#else
  1122. X#define LOCK while((lock = creat(LOCKPATH,0)) < 0)
  1123. X#define UNLOCK (void) unlink(LOCKPATH)
  1124. X#endif
  1125. X
  1126. X#define ENTRIES 15
  1127. X
  1128. X#if    MSDOS | AMIGA    /* M001 */
  1129. X#define     getuid()    0
  1130. X#else
  1131. Xextern int getuid();
  1132. X#endif
  1133. X
  1134. Xextern int saved_game;  /* prevent recording of hiscore if  */
  1135. X            /* NO_RESTORED_GAME_HISCORES is #def'd */
  1136. X
  1137. Xtypedef struct
  1138. X    {
  1139. X    char howdead[25];
  1140. X    char name[20];
  1141. X    int  score;
  1142. X    int  level;
  1143. X    int  uid;
  1144. X    } score_entry;
  1145. X
  1146. X#ifdef    LINT_ARGS    /* M001    */
  1147. Xvoid show_scores(score_entry *,int );
  1148. Xint readtable(score_entry *);
  1149. X#else
  1150. Xvoid show_scores();
  1151. Xint readtable();
  1152. X#endif
  1153. X
  1154. Xvoid show_scores(table,num)
  1155. Xscore_entry *table;
  1156. Xint         num;
  1157. X{
  1158. Xint tot = num;
  1159. X
  1160. X/* only show the top ten */
  1161. Xif (num > 10) num = tot = 10;
  1162. X
  1163. Xaddstr("\nNo. Score Level           Names                 How they died\n");
  1164. Xaddstr("=============================================================================\n");
  1165. Xwhile(num > 0)
  1166. X    {
  1167. X    char buffer[80];
  1168. X    num--;
  1169. X    sprintf(buffer,"%2d %5d %3d      %-20s     killed by %-s\n",(tot - num),table->score,table->level,table->name,table->howdead);
  1170. X    addstr(buffer);
  1171. X    table++;
  1172. X    }
  1173. Xaddstr("\n");
  1174. X}
  1175. X
  1176. Xint readtable(table_ptr)
  1177. Xscore_entry *table_ptr;
  1178. X{
  1179. XFILE *fp;
  1180. Xint  numread;
  1181. Xif((fp = fopen(HISCOREPATH,R_BIN)) == NULL)
  1182. X    {
  1183. X    numread = 0;
  1184. X    }
  1185. Xelse
  1186. X    {
  1187. X    numread = fread( VOIDSTAR table_ptr, sizeof(score_entry), ENTRIES, fp);
  1188. X    fclose(fp);
  1189. X    }
  1190. Xreturn numread;
  1191. X}
  1192. X
  1193. Xint  savescore(howdead,score,level,name)
  1194. Xchar *howdead, *name;
  1195. Xint  score,level;
  1196. X{
  1197. Xscore_entry table[ENTRIES + 2],
  1198. X        *table_ptr = table,new_entry,temp_entry;
  1199. Xint  numread,index = 1, numsaved, lock, already = 0, output_value = 1,
  1200. X     user_id;
  1201. XFILE *fp;
  1202. X#ifdef NO_RESTORED_GAME_HISCORES
  1203. Xif(saved_game) {
  1204. X    addstr("No hiscores recorded from restored games.\n");
  1205. X        addstr("\nWanderer (C) 1988  S.Shipway.\n\n");
  1206. X    return 1;
  1207. X}
  1208. X#endif
  1209. Xuser_id = getuid();
  1210. Xstrncpy(new_entry.howdead,howdead,25);
  1211. Xnew_entry.howdead[24] = '\0';    /* M002 strncpy does not null terminate */
  1212. Xstrncpy(new_entry.name,name,20);
  1213. Xnew_entry.name[19] = '\0';    /* M002 strncpy does not null terminate */
  1214. Xnew_entry.score = score;
  1215. Xnew_entry.level = level;
  1216. Xnew_entry.uid = user_id;
  1217. XLOCK;
  1218. Xnumread = readtable(table_ptr);
  1219. Xif (numread > 0)
  1220. X    if(table[numread-1].score > 99999)     /* stop system errors messing it up*/
  1221. X        {
  1222. X        numread--;
  1223. X        addstr("Erasing spurious entry in table.\n");
  1224. X        }
  1225. Xif(score == 0)
  1226. X    {
  1227. X    show_scores(table,numread);
  1228. X    UNLOCK;
  1229. X    return 0;
  1230. X    }
  1231. Xif (numread > 0)
  1232. X    {
  1233. X    numread++; /* scan through until correct insertion point */
  1234. X    /* pass table entries with higher scores */
  1235. X    while((table_ptr->score > score)&&(index < numread))
  1236. X    {
  1237. X#ifdef    COMPARE_BY_NAME
  1238. X#define    SAMEUSER(p)    (strcmp((p)->name, name) == 0)
  1239. X#else
  1240. X#define    SAMEUSER(p)    ((p)->uid == user_id)
  1241. X#endif
  1242. X    if(SAMEUSER(table_ptr))
  1243. X        {
  1244. X        already = 1;
  1245. X        break;
  1246. X        }
  1247. X    table_ptr++;
  1248. X    index++;
  1249. X    }
  1250. X    /* pass table entries with equal score but higher or equal level */
  1251. X    while((table_ptr->level>=level)&&(index<numread)&&(table_ptr->score==score))
  1252. X    {
  1253. X    if(SAMEUSER(table_ptr))
  1254. X        {
  1255. X        already = 1;
  1256. X        break;
  1257. X        }
  1258. X    table_ptr++;
  1259. X    index++;
  1260. X    }
  1261. X    /* if already found: done */
  1262. X    if(already == 1)
  1263. X    {
  1264. X    numread--;
  1265. X    show_scores(table,numread);
  1266. X    UNLOCK;
  1267. X    return numread;
  1268. X    }
  1269. X    /* shift down score list */
  1270. X    while(index < numread)
  1271. X    {
  1272. X    /* swap *table_ptr and new_entry */
  1273. X    temp_entry = *table_ptr;
  1274. X    *table_ptr = new_entry;
  1275. X    new_entry = temp_entry;
  1276. X    if(SAMEUSER(&new_entry))
  1277. X        {
  1278. X        already = 1;
  1279. X        numread--; /* an older entry found */
  1280. X        break;
  1281. X        }
  1282. X    table_ptr++;
  1283. X    index++;
  1284. X    }
  1285. X    /* if all shifted without finding an older entry */
  1286. X    if(already==0)
  1287. X    *table_ptr = new_entry;
  1288. X    }
  1289. Xelse
  1290. X    {
  1291. X    addstr("\nCreating new hiscore table.\n\n");
  1292. X    *table_ptr = new_entry;
  1293. X    numread++;
  1294. X    }
  1295. Xnumread = ( (numread > ENTRIES) ? ENTRIES : numread );
  1296. Xif ((fp = fopen(HISCOREPATH,W_BIN)) == NULL)
  1297. X    {
  1298. X    UNLOCK;
  1299. X    return 0;
  1300. X    }
  1301. Xtable_ptr = table;
  1302. Xnumsaved = fwrite( VOIDSTAR table_ptr, sizeof(score_entry), numread, fp);
  1303. Xchmod(HISCOREPATH,0666);
  1304. Xif(numsaved < numread)
  1305. X    {
  1306. X    output_value = 0;
  1307. X    }
  1308. Xfclose(fp);
  1309. XUNLOCK;
  1310. Xshow_scores(table,numsaved);
  1311. Xreturn output_value;
  1312. X}
  1313. X
  1314. Xvoid delete_entry(num)
  1315. Xint num;
  1316. X{
  1317. Xscore_entry table[ENTRIES + 22],
  1318. X        *table_ptr = table;
  1319. Xint  numread,index = 1, numsaved, lock, output_value = 1;
  1320. XFILE *fp;
  1321. XLOCK;
  1322. Xnumread = readtable(table_ptr);
  1323. Xif (numread == 0) {
  1324. X    addstr("Missing or unreadable hiscore table.\n\n");
  1325. X    UNLOCK;
  1326. X    exit(1);
  1327. X}
  1328. Xif (num > numread) {
  1329. X    addstr("Invalid entry, choose again\n");
  1330. X    UNLOCK;
  1331. X    return;
  1332. X}
  1333. Xwhile(index < num)
  1334. X    {
  1335. X    index++;
  1336. X    table_ptr++;
  1337. X    }
  1338. Xwhile(index < numread)
  1339. X    {
  1340. X    index++;
  1341. X    *table_ptr = *(table_ptr+1);
  1342. X    table_ptr++;
  1343. X    }
  1344. Xnumread--;
  1345. Xfp = fopen(HISCOREPATH,W_BIN);
  1346. Xtable_ptr = table;
  1347. Xnumsaved = fwrite( VOIDSTAR table_ptr, sizeof(score_entry), numread, fp);
  1348. Xchmod(HISCOREPATH,0666);
  1349. Xif(numsaved < numread)
  1350. X    {
  1351. X    output_value = 0;
  1352. X    }
  1353. Xfclose(fp);
  1354. XUNLOCK;
  1355. Xshow_scores(table,numsaved);
  1356. X}
  1357. X
  1358. Xerase_scores()
  1359. X{
  1360. Xint erasenum,numread,index = 0;
  1361. Xchar correct[20],c,buffer[20];
  1362. Xscore_entry table[ENTRIES + 2],
  1363. X        *table_ptr = table;
  1364. Xaddstr("Please enter password:");
  1365. Xwhile((c = getchar()) != '\n' && index <19) {
  1366. X    correct[index++] = c;
  1367. X    }
  1368. Xcorrect[index] = 0;
  1369. Xif(strcmp(correct,MASTERPASSWORD))
  1370. X    {
  1371. X    addstr("\nFoo, charlatan!\n");
  1372. X    return 0;
  1373. X    }
  1374. Xnumread = readtable(table_ptr);
  1375. Xshow_scores(table,numread);
  1376. Xaddstr("\n");
  1377. Xfor(;;)
  1378. X{
  1379. Xaddstr("Number to erase (0 to exit): ");
  1380. Xgets(buffer);
  1381. Xerasenum = atoi(buffer);
  1382. Xaddstr("\n");
  1383. Xif(erasenum == 0)
  1384. X    break;
  1385. Xdelete_entry(erasenum);
  1386. Xaddstr("\n");
  1387. X}
  1388. Xaddstr("Byee!\n");
  1389. X}
  1390. SHAR_EOF
  1391. echo "extracting wand_head.h"
  1392. sed 's/^X//' << \SHAR_EOF > wand_head.h
  1393. X#include <stdio.h>
  1394. X#include <curses.h>
  1395. X#include <string.h>
  1396. X#include <fcntl.h>
  1397. X
  1398. X/* I wouldnt change these if I were you - it wont give you a bigger screen */
  1399. X#define ROWLEN 40
  1400. X#define NOOFROWS 16
  1401. X
  1402. X/* Change these to the necessary directories or files */
  1403. X#define SCREENPATH "/usr/games/lib/wand/screens"
  1404. X#define HISCOREPATH "/usr/games/lib/wand/hiscore"
  1405. X#define LOCKPATH "/tmp/wanderer.lock"      /* hiscore lock file */
  1406. X#define DICTIONARY "/usr/dict/words"
  1407. X
  1408. X/* change this to anything, but dont forget what */
  1409. X#define MASTERPASSWORD "squiggly worms"
  1410. X
  1411. X/* change the numbers in this as well, but keep it in the same form */
  1412. X#define PASSWD (num * num * 4373 + num * 16927 + 39)
  1413. X
  1414. X/* To disable the recording of hiscores from games restored from saves */
  1415. X/* #define NO_RESTORED_GAME_HISCORES  */
  1416. X/* #define COMPARE_BY_NAME  define this to compare by name, not uid */
  1417. X#define GUESTUID 0    /* guestuid always compared by name */
  1418. X/* #define NO_ENCRYPTION define this to disable the savefile encryptor */
  1419. X/* cbreak switching via curses package. */
  1420. X/* on some Ultrix systems you may need to use crmode() and nocrmode() */
  1421. X/* if so, just change the #defs to the necessary. I also know that Xenix */
  1422. X/* systems have to use crmode, so.. */
  1423. X#ifdef XENIX
  1424. X#define CBON crmode()
  1425. X#define CBOFF nocrmode()
  1426. X#else
  1427. X#define CBON cbreak()
  1428. X#define CBOFF nocbreak()
  1429. X#endif
  1430. X
  1431. X/* AMIGA version supports color and sound.  for other versions */
  1432. X/* the following macros expand to nothing. */
  1433. X#ifndef AMIGA
  1434. X#define setcolor(forecolor, backcolor)
  1435. X#define playSound(whichone)
  1436. X#define cursor(state)
  1437. X#endif
  1438. X
  1439. X/* MSDOS modifications (M001) by Gregory H. Margo    */
  1440. X#ifdef    MSDOS
  1441. X#define    R_BIN    "rb"    /* binary mode for non-text files */
  1442. X#define    W_BIN    "wb"
  1443. X# ifdef    VOIDPTR
  1444. X#  define VOIDSTAR    (void *)
  1445. X# else
  1446. X#  define VOIDSTAR    (char *)
  1447. X# endif
  1448. X#define    ASKNAME        /* ask user's name if not in environment */
  1449. X#define    COMPARE_BY_NAME    /* compare users with name, not uid    */
  1450. X#undef    getchar        /* remove stdio's definition to use curses'     */
  1451. X#define    getchar()    getch()    /* use curse's definition instead */
  1452. X
  1453. X#else /* not MSDOS */
  1454. X#define    R_BIN    "r"
  1455. X#define    W_BIN    "w"
  1456. X#define    VOIDSTAR
  1457. X#endif
  1458. X
  1459. X/* AMIGA modifications by Alan Bland */
  1460. X#ifdef AMIGA
  1461. X#undef    SCREENPATH
  1462. X#undef    HISCOREPATH
  1463. X#undef    DICTIONARY
  1464. X#define SCREENPATH "screens"
  1465. X#define HISCOREPATH "hiscore"
  1466. X#define    ASKNAME        /* ask user's name if not in environment */
  1467. X#define    COMPARE_BY_NAME    /* compare users with name, not uid    */
  1468. X#define NO_ENCRYPTION    /* define this to disable the savefile encryptor */
  1469. X#define LINT_ARGS    /* Lattice compiler uses ANSI prototypes */
  1470. X#undef    VOIDSTAR
  1471. X#define VOIDSTAR    (void *)
  1472. X#undef    getchar        /* remove stdio's definition to use curses'     */
  1473. X#define    getchar()    getch()    /* use curse's definition instead */
  1474. X#define gets(s)        getstr(s) /* curses version */
  1475. X#include "sounds.h"    /* index into sound table */
  1476. X#endif
  1477. X
  1478. X/* Save and Restore game additions (M002) by Gregory H. Margo    */
  1479. X/* mon_rec structure needed by save.c */
  1480. Xstruct mon_rec
  1481. X    {
  1482. X    int x,y,mx,my;
  1483. X    char under;
  1484. X    struct mon_rec *next,*prev;
  1485. X    };
  1486. X
  1487. X
  1488. Xstruct    save_vars    {
  1489. X    int    z_x, z_y,
  1490. X        z_nx, z_ny,
  1491. X        z_sx, z_sy,
  1492. X        z_tx, z_ty,
  1493. X        z_lx, z_ly,
  1494. X        z_mx, z_my,
  1495. X        z_bx, z_by,
  1496. X        z_nbx, z_nby,
  1497. X        z_max_score,
  1498. X        z_diamonds,
  1499. X        z_nf,
  1500. X        z_hd,
  1501. X        z_vd,
  1502. X        z_xdirection,
  1503. X        z_ydirection;
  1504. X};
  1505. X
  1506. X/* prototypes added by Gregory H. Margo */
  1507. X#ifdef    LINT_ARGS    /* M001 */
  1508. X/* DISPLAY.c */
  1509. Xextern  void map(char (*)[ROWLEN+1]);
  1510. Xextern  void display(int ,int ,char (*)[ROWLEN+1],int );
  1511. X
  1512. X/* EDIT.C */
  1513. Xextern  void instruct(void);
  1514. Xextern  void noins(void);
  1515. Xextern  void editscreen(int ,int *,int *,int ,char *);
  1516. X
  1517. X/* FALL.C */
  1518. Xextern  int check(int *,int *,int ,int ,int ,int ,int ,int ,char *);
  1519. Xextern  int fall(int *,int *,int ,int ,int ,int ,char *);
  1520. X
  1521. X/* GAME.C */
  1522. Xextern  struct mon_rec *make_monster(int ,int );
  1523. Xextern  char *playscreen(int *,int *,int *,int ,char *);
  1524. X
  1525. X/* ICON.C */
  1526. Xextern  void draw_symbol(int ,int ,char );
  1527. X
  1528. X/* JUMP.C */
  1529. Xextern  int scrn_passwd(int ,char *);
  1530. Xextern  void showpass(int );
  1531. Xextern  int jumpscreen(int );
  1532. Xextern  int getnum(void);
  1533. X
  1534. X/* READ.C */
  1535. Xextern  int rscreen(int ,int *);
  1536. Xextern  int wscreen(int ,int );
  1537. X
  1538. X/* SAVE.C */
  1539. Xextern  void save_game(int ,int *,int *,int ,struct mon_rec *,struct mon_rec *);
  1540. Xextern  void restore_game(int *,int *,int *,int *,struct mon_rec *,struct mon_rec **);
  1541. X
  1542. X/* SCORES.C */
  1543. Xextern  int savescore(char *,int ,int ,char *);
  1544. Xextern  void delete_entry(int );
  1545. Xextern  int erase_scores(void);
  1546. X
  1547. X#else
  1548. X
  1549. X/* DISPLAY.c */
  1550. Xextern  void map();
  1551. Xextern  void display();
  1552. X
  1553. X/* EDIT.C */
  1554. Xextern  void instruct();
  1555. Xextern  void noins();
  1556. Xextern  void editscreen();
  1557. X
  1558. X/* FALL.C */
  1559. Xextern  int check();
  1560. Xextern  int fall();
  1561. X
  1562. X/* GAME.C */
  1563. Xextern  struct mon_rec *make_monster();
  1564. Xextern  char *playscreen();
  1565. X
  1566. X/* ICON.C */
  1567. Xextern  void draw_symbol();
  1568. X
  1569. X/* JUMP.C */
  1570. Xextern  int scrn_passwd();
  1571. Xextern  void showpass();
  1572. Xextern  int jumpscreen();
  1573. Xextern  int getnum();
  1574. X
  1575. X/* READ.C */
  1576. Xextern  int rscreen();
  1577. Xextern  int wscreen();
  1578. X
  1579. X/* SAVE.C */
  1580. Xextern  void save_game();
  1581. Xextern  void restore_game();
  1582. X
  1583. X/* SCORES.C */
  1584. Xextern  int savescore();
  1585. Xextern  void delete_entry();
  1586. Xextern  int erase_scores();
  1587. X
  1588. X#endif
  1589. SHAR_EOF
  1590. echo "End of archive 3 (of 3)"
  1591. # if you want to concatenate archives, remove anything after this line
  1592. exit
  1593.